package org.gd.hellojavacore.patterns.prototype;

import org.gd.hellojavacore.patterns.CreationalPattern;

/**
 <pre>

 Назначение

 Задаёт виды создаваемых объектов с помощью экземпляра-прототипа и создаёт новые объекты путём
 копирования этого прототипа. Проще говоря, это паттерн создания объекта через клонирование другого объекта
 вместо создания через конструктор.

 Применимость

 Паттерн используется чтобы:

 1. избежать дополнительных усилий по созданию объекта стандартным путем (имеется в виду использование
 ключевого слова 'new', когда вызывается конструктор не только самого объекта, но и конструкторы всей
 иерархии предков объекта), когда это непозволительно дорого для приложения.

 2. избежать наследования создателя объекта (object creator) в клиентском приложении, как это делает
 паттерн abstract factory.
 Используйте этот шаблон проектирования, когда система не должна зависеть от того, как в ней создаются,
 компонуются и представляются продукты:

 3. инстанцируемые классы определяются во время выполнения, например с помощью динамической загрузки;

 4. для того чтобы избежать построения иерархий классов или фабрик, параллельных иерархии классов продуктов;

 5. экземпляры класса могут находиться в одном из нескольких различных состояний. Может оказаться
 удобнее установить соответствующее число прототипов и клонировать их, а не инстанцировать каждый
 раз класс вручную в подходящем состоянии

 </pre>
 */
public class Prototype implements CreationalPattern {

    public static void main(String args[]) throws CloneNotSupportedException {
        Cookie tempCookie = null;
        Cookie prot = new CoconutCookie();
        CookieMachine cm = new CookieMachine(prot);
        for (int i = 0; i < 100; i++)
            tempCookie = cm.makeCookie();
    }
}
